'\" te
.\"  Copyright (c) 2001 Sun Microsystems, Inc.  All Rights Reserved.
.\" The contents of this file are subject to the terms of the Common Development and Distribution License (the "License").  You may not use this file except in compliance with the License.
.\" You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE or http://www.opensolaris.org/os/licensing.  See the License for the specific language governing permissions and limitations under the License.
.\" When distributing Covered Code, include this CDDL HEADER in each file and include the License file at usr/src/OPENSOLARIS.LICENSE.  If applicable, add the following below this CDDL HEADER, with the fields enclosed by brackets "[]" replaced with your own identifying information: Portions Copyright [yyyy] [name of copyright owner]
.TH DDI_MODEL_CONVERT_FROM 9F "Feb 8, 2001"
.SH NAME
ddi_model_convert_from \- determine data model type mismatch
.SH SYNOPSIS
.nf
#include <sys/ddi.h>
#include <sys/sunddi.h>

\fB uint_t\fR\fBddi_model_convert_from\fR(\fBuint_t\fR \fImodel\fR);
.fi

.SH INTERFACE LEVEL
illumos DDI specific (illumos DDI).
.SH PARAMETERS
.ne 2
.na
\fB\fImodel\fR \fR
.ad
.RS 10n
The data model type of the current thread.
.RE

.SH DESCRIPTION
\fBddi_model_convert_from()\fR is used to determine if the current thread uses
a different \fBC\fR Language Type Model than the device driver. The 64-bit
version of illumos will require a 64-bit kernel to support both 64-bit and
32-bit user mode programs. The difference between a 32-bit program and a 64-bit
program is in its \fBC\fR Language Type Model: a 32-bit program is \fBILP32\fR
(integer, longs, and pointers are 32-bit) and a 64-bit program is \fBLP64\fR
(longs and pointers are 64-bit). There are a number of driver entry points such
as \fBioctl\fR(9E) and \fBmmap\fR(9E) where it is necessary to identify the
\fBC\fR Language Type Model of the user-mode originator of an kernel event. For
example any data which flows between programs and the device driver or vice
versa need to be identical in format. A 64-bit device driver may need to modify
the format of the data before sending it to a 32-bit application.
\fBddi_model_convert_from()\fR is used to determine if data that is passed
between the device driver and the application requires reformatting to any
non-native data model.
.SH RETURN VALUES
.ne 2
.na
\fB\fBDDI_MODEL_ILP32\fR \fR
.ad
.RS 20n
A conversion to/from \fBILP32\fR is necessary.
.RE

.sp
.ne 2
.na
\fB\fBDDI_MODEL_NONE\fR \fR
.ad
.RS 20n
No conversion is necessary. Current thread and driver use the same data model.
.RE

.SH CONTEXT
\fBddi_model_convert_from()\fR can be called from any context.
.SH EXAMPLES
\fBExample 1 \fR: Using \fBddi_model_convert_from()\fR in the \fBioctl()\fR
entry point to support both 32-bit and 64-bit applications.
.sp
.LP
The following is an example how to use \fBddi_model_convert_from()\fR in the
\fBioctl()\fR entry point to support both 32-bit and 64-bit applications.

.sp
.in +2
.nf
struct passargs32 {
        int len;
        caddr32_t addr;
};

struct passargs {
        int len;
        caddr_t addr;
};
xxioctl(dev_t dev, int cmd, intptr_t arg, int mode,
    cred_t *credp, int *rvalp) {
        struct passargs pa;

        switch (ddi_model_convert_from(mode & FMODELS)) {
            case DDI_MODEL_ILP32:
            {
                struct passargs32 pa32;

                ddi_copyin(arg, &pa32, sizeof (struct passargs32), mode);
                pa.len = pa32.len;
                pa.address = pa32.address;
                break;
            }
            case DDI_MODEL_NONE:
                ddi_copyin(arg, &pa, sizeof (struct passargs), mode);
                break;
        }

        do_ioctl(&pa);
        .\|.\|.\|.
}
.fi
.in -2

.SH SEE ALSO
.BR ioctl (9E),
.BR mmap (9E),
.BR ddi_mmap_get_model (9F)
.sp
.LP
\fIWriting Device Drivers\fR
